//是否是回文
public class PalindromeString {
    // 判断字符串是否是回文
    public static boolean isPalindrome(String str) {
        if (str == null) {
            return false; // 处理空值的情况
        }

        int left = 0; // 左指针
        int right = str.length() - 1; // 右指针

        while (left < right) {
            // 忽略非字母数字字符和大小写
            while (left < right && !Character.isLetterOrDigit(str.charAt(left))) {
                left++;
            }
            while (left < right && !Character.isLetterOrDigit(str.charAt(right))) {
                right--;
            }
            // 比较字符
            if (Character.toLowerCase(str.charAt(left)) != Character.toLowerCase(str.charAt(right))) {
                return false; // 不同，返回false
            }
            left++; // 移动左指针
            right--; // 移动右指针
        }
        return true; // 如果所有字符都匹配，返回true
    }

    // 测试函数
    public static void main(String[] args) {
        //定义一个数组，测试里面的元素是否是回文
        String[] testStrings = {
                "A man, a plan, a canal: Panama",
                "racecar",
                "hello",
                "No 'x' in Nixon",
                "Was it a car or a cat I saw?",
                "12321",
                "Not a palindrome"
        };

        for (String test : testStrings) {
            System.out.println(isPalindrome(test));
        }
    }
}
